iT邦幫忙

2022 iThome 鐵人賽

DAY 6
3
Modern Web

Nuxt 3 學習筆記系列 第 6 篇

[Day 06] Nuxt 3 目錄結構與自動載入 (Auto Imports)

  • 分享至 

  • xImage
  •  

Vue.js → Nuxt 入門書籍推薦.《想要 SSR 嗎?就使用 Nuxt 吧!Nuxt 讓 Vue.js 更好處理 SEO 搜尋引擎最佳化》

🔥【Vue.js → Nuxt 入門推薦!🌟 新書即將上市 🌟】
📘《想要 SSR 嗎?就使用 Nuxt 吧!Nuxt 讓 Vue.js 更好處理 SEO 搜尋引擎最佳化》
👀 Nuxt v4 內容與範例也可以參考並購買本系列文筆著所著書籍
📦 預計於:2025/08/14 出版,目前天瓏書局預購有 7️⃣8️⃣ 折優惠
👉 點此前往購買:https://pse.is/7yulm5

注意:Nuxt 4 已於 2025/07/16 釋出,本文部分內容或範例可能和最新版本有所不同

前言

隨著整個專案的開發,目錄與元件勢必也會越來越多,如同 Vue 3 的專案可能會有專門放置元件目錄 components 等,在 Vue 3 我們可能不太需要去在意目錄的名稱,但在 Nuxt 3 的專案下,有一些目錄與名稱其實有一些基本的規定與名稱,只要照著 Nuxt 3 約定好的方式進行開發,就能更好利用 Nuxt 3 幫你完成許多貼心的功能。

Nuxt 3 的目錄結構

當我們 Nuxt CLI 建立第一個 Nuxt 3 專案並第一次啟動開發伺服器後,專案目錄結構會長得像這樣:
https://ithelp.ithome.com.tw/upload/images/20220921/20152617AZ8LJ9jTfE.png

如果你是跟著這個系列安裝了 TypeScript、Linter 及 Tailwind CSS 等套件,那麼專案目錄結構會長得像這樣:
https://ithelp.ithome.com.tw/upload/images/20220921/201526177efTtbr39T.png

雖然我們能依照需求建立檔案及目錄,但 Nuxt 3 在目錄的結構與命名其實有一定的規則與模式,以下針對 Nuxt 3 來講述一下目錄的結構與遵循的方式。

Nuxt 3 預設的目錄結構

Nuxt 3 框架希望我們可以專注在開發而不是在配置,所以在預設的情況專案的目錄架構已經有一個不錯的結構可以遵循。

一個完整的 Nuxt 3 專案,它的目錄結構如下:

nuxt-app/
├── .nuxt/
├── .output/
├── assets/
├── components/
├── composables/
├── content/
├── layouts/
├── middleware/
├── node_modules/
├── pages/
├── plugins/
├── public/
└── server/
    ├── api/
    ├── routes/
    └── middleware/
├── .gitignore
├── .nuxtignore
├── app.config.ts
├── app.vue
├── nuxt.config.ts
├── package.json
└── tsconfig.json

.nuxt 目錄

開發環境下由 Nuxt 產生出 Vue 的網站,.nuxt 目錄是自動產生的,你不應該任意的調整裡面檔案。

.output 目錄

當你的網站準備部署至正式環境時,每次編譯建構專案時,皆會自動重新產生這個目錄,你不應該任意的調整裡面檔案。

assets 目錄

顧名思義,這是靜態資源檔案所放置的位置,目錄內通常包含以下類型的檔案:

  • CSS 樣式檔案 (CSS、SASS 等...)
  • 字型
  • 圖片

這些靜態資源,最終在專案編譯建構時,由 Vite 或 webpack 進行編譯打包。

components 目錄

放置 Vue 元件的地方,Nuxt 會自動載入這個目錄中的任何元件。

composables 目錄

組合式函數放置的目錄,簡單來說可以把常用或通用的功能寫成一個共用的函數或 JS 檔案,放置在這個目錄視為組合式函數,Nuxt 也會自動載入這些組合式函數,讓需要使用的頁面或元件可以直接做使用。

content 目錄

透過使用 Nuxt Content,我們可以在這個目錄下建立 .md、.yml、.csv 和 .json 檔案,Nuxt Content 會讀取並解析這些文件並進行渲染,用來建立基於文件的 CMS。

layouts 目錄

用於放置通用或可能重複使用到的佈局模板,提供程式碼的可重複使用性。

middleware 目錄

Nuxt 3 提供了路由中間件的概念,用以在導航到下一個頁面之前執行一些程式碼如權限驗證。

node_modules 目錄

通常有使用 Node.js 的套件管理,例如 NPM,對此目錄應該有一些印象,使用 Nuxt 3 及專案所需要的相依套件都會存放在這個目錄。

pages 目錄

這個目錄主要是用來配置我們的頁面,你也可以只使用 app.vue 來完成你的網站,但如果建立了 pages 這個目錄,Nuxt 3 會自動整合 vue-router,並會依據目錄及檔案結構規則來自動產生出對應路由,也是 Nuxt3 產生路由的方式。

plugins 目錄

Nuxt 會自動載入這個目錄檔案,作為插件使用,在檔案名稱可以使用後綴 .server 或 .client,例如, plugin.server.ts 或 plugin.client.ts 來決定只讓伺服器端或客戶端載入這個插件。

public 目錄

這個目錄主要用於伺服器根目錄提供的文件,包含必須固定的檔案名稱如 robots.txt 或不太會變動的 favicon.ico。

server 目錄

用於建立任何後端的邏輯如後端 API,這個目錄下還包含了 api、server 和 middleware 來區分功能,不具有自動載入,但支援 HMR。

.gitignore 檔案

在使用 Git 版本控制時,可以設置一些不需要或忽略關注變動的檔案及目錄。

.nuxtignore 檔案

可以設置讓 Nuxt 編譯建構時,一些不需要或忽略檔案。

app.config.ts 檔案

提供服務運行時暴露給客戶端使用的設定,因此,請不要在 app.config.ts 檔案中添加任何機密資訊。

app.vue 檔案

Nuxt 3 網站的入口點元件。

nuxt.config.ts 檔案

用於配置 Nuxt 專案的設定檔。

package.json 檔案

這個檔案裡面定義了專案資訊、腳本、相依套件及版本號,通常有使用 Node.js 套件管理工具建置的專案都會包含此檔案。

tsconfig.json 檔案

Nuxt 3 會在 .nuxt 目錄下自動產生一個 tsconfig.json 檔案,其中已經包含了一些解析別名等預設配置;你可以透過專案目錄下的 tsconfig.json 來配置擴展或覆蓋 Nuxt 3 預設的 TypeScript 設定檔。

自訂目錄名稱

前面簡介了Nuxt 3 的預設目錄結構與用途,在目錄名稱上 Nuxt 3 也提供了可以調整目錄名稱的方式,只要在 nuxt.config.ts 修改對應的參數,就可以自訂目錄的名稱。不過呢,也並不是所有的目錄都能修改,目前官方提供的 dir 參數共有以下四個目錄參數選項供修改:

  • layouts
  • middleware
  • pages
  • public

例如我想將 pages 目錄名稱調整為 views 就可以新增下列 dir 設定添加至 nuxt.config.ts,就可以將 pages 目錄功能及規則調整為 views 目錄來實現。

export default defineNuxtConfig({
  dir: {
    pages: 'views',
  }
}

自動載入 (Auto Imports)

在介紹目錄結構時有提到,某些目錄下的檔案是具有自動載入 (Auto Imports)的功能,意思就是說,當我們在這些特定的目錄 components、composables、layouts、plugin 添加檔案時,Nuxt 3 會自動載入這些元件或函數,

Nuxt 3 的自動載入具體有以下三種:

  • Nuxt 常用元件與函數
  • Vue 3 的 API
  • 基於目錄的自動載入

Nuxt 常用元件與函數的自動載入

Nuxt 會自動載入一些元件或組合式函數,用以讓開發時可以在全部頁面或定義元件和插件可以使用。

Nuxt 自動載入的元件就好比 app.vue 程式碼內,一開始在 template 就有的 <NuxtWelcome /> 歡迎頁面元件,其他還包含了 <NuxtPage>、<NuxtLayout> 和 <NuxtLink> 等,詳細可以參考官方文件

例如,下面程式碼中的 useAsyncData 與 $fetch 就是 Nuxt 自動載入的組合式函數,在各個頁面或元件都能做使用。

<script setup>
const { data, refresh, pending } = await useAsyncData('/api/hello', () => $fetch('/api/hello'))
</script>

Vue 3 的 API 的自動載入

例如,Vue 3 中會使用到的 ref、computed 等這類的 helpers 或 lifecycle hooks,在 Nuxt 3 也都將會自動的載入,不需要在 import。

<script setup>
// 不需要在 import ref 或 computed
const count = ref(1)
const double = computed(() => count.value * 2)
</script>

基於目錄的自動載入

如前面所提及的,Nuxt 會自動載入定義在特定目錄的檔案,例如:

  • components: 相對於 Vue 的元件。
  • composables: 相對於 Vue 的組合式函數。

建立一個自動導入的元件

我們建立一個 ./components/IronManWelcome.vue 檔案:

<template>
  <div class="bg-white py-24">
    <div class="flex flex-col items-center">
      <h1 class="text-6xl font-semibold text-sky-400">2022 iThome</h1>
      <p class="mt-4 text-9xl font-bold text-gray-600">鐵人賽</p>
    </div>
  </div>
</template>

在 app.vue 檔案中,新增 <IronManWelcome /> 元件。

<template>
  <div>
    <IronManWelcome />
  </div>
</template>

現在,瀏覽器可以看見我們添加的元件效果。
https://ithelp.ithome.com.tw/upload/images/20220921/20152617Po6tI3jRgo.png

可以發現,我們不需要添加 import IronManWelcome from './components/IronManWelcome' 就可以直接在 template 直接使用 <IronManWelcome /> 元件,這就是 Nuxt 3 基於目錄的自動載入功能。

關閉自動載入

如果想關閉 Nuxt 的自動載入元件或函數的功能,可以修改專案目錄下的 nuxt.config.ts 檔案,將 imports.autoImport 設定為 false。

export default defineNuxtConfig({
  imports: {
    autoImport: false
  }
})

顯式載入 (Explicit Imports)

Explicit (顯式、明確的),當我們需要手動載入,就可以用 #import 這個 Nuxt 釋出的別名,來個別載入那些具有自動載入的元件或函數。

<script setup>
import { ref, computed } from '#imports'

const count = ref(1)
const double = computed(() => count.value * 2)
</script>

小結

Nuxt 3 的專案目錄與結構已經有一個規定可以遵守,Nuxt 3 規劃的目錄及檔案架構,讓我們可以不用再煩惱該如何配置,只需要專注開發,當你熟悉這些目錄檔案規則與自動載入的特性,肯定能更快上手 Nuxt 3。


感謝大家的閱讀,這是我第一次參加 iThome 鐵人賽,請鞭小力一些,也歡迎大家給予建議 :)
如果對這個 Nuxt 3 系列感興趣,可以訂閱接收通知,也歡迎分享給喜歡或正在學習 Nuxt 3 的夥伴。

範例程式碼

參考資料

Vue.js → Nuxt 入門書籍推薦.《想要 SSR 嗎?就使用 Nuxt 吧!Nuxt 讓 Vue.js 更好處理 SEO 搜尋引擎最佳化》


上一篇
[Day 05] Nuxt 3 如何使用 Tailwind CSS
下一篇
[Day 07] Nuxt 3 頁面 (Pages) 與路由 (Routing)
系列文
Nuxt 3 學習筆記 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
fukahire
iT邦新手 4 級 ‧ 2023-08-15 14:30:00

同脈絡的東西放在一起講變得好清楚

我要留言

立即登入留言